#include "CBitmapFont.h"
#include "SGD Wrappers\CSGD_TextureManager.h"

CBitmapFont::CBitmapFont()
{
	m_nFontImageID = CSGD_TextureManager::GetInstance()->LoadTexture("resource/fonts/oldenglishfont.png");
	m_nCharWidth = 32;
	m_nCharHeight = 32;
	m_nCols = 10;
	m_nStartChar = 32;
}

CBitmapFont::~CBitmapFont()
{
}

RECT CBitmapFont::CellAlgorithm(int id)
{
	RECT temprect;
	temprect.left = (id % m_nCols) * m_nCharWidth;
	temprect.top = (id / m_nCols) * m_nCharHeight;
	temprect.right = temprect.left + m_nCharWidth;
	temprect.bottom = temprect.top + m_nCharHeight;
	return temprect;
}

void CBitmapFont::Print(char* szTextToPrint, int nPosX, int nPosY, float scale, DWORD dwColor)
{
	int size = strlen(szTextToPrint);
	int nOrigX = nPosX;
	for(int i = 0; i < size; i++)
	{
		char ch = szTextToPrint[i];
		if(ch == ' ')
		{
			nPosX += (int)(m_nCharWidth * scale);
			continue;
		}
		else if(ch == '\n')
		{
			nPosX = nOrigX;
			nPosY += (int)(m_nCharHeight * scale);
			continue;
		}
		int id = ch - m_nStartChar;
		RECT rLetter = CellAlgorithm(id);
		switch(ch)
		{
		case 103: //G
			{
				nPosY+=2;
			}
			break;
		case 106: //J
			{
				nPosY+=2;
			}
			break;
		case 112: //P
			{
				nPosY+=2;
			}
			break;
		case 113: //Q
			{
				nPosY+=2;
			}
			break;
		case 121: //Y
			{
				nPosY+=2;
			}
			break;
		case 122: //Z
			{
				nPosY+=2;
			}
			break;
		}
		CSGD_TextureManager::GetInstance()->Draw(m_nFontImageID, nPosX, nPosY, scale, scale, &rLetter, 0, 0, 0, dwColor);
		switch(ch)
		{
		case 103: //G
			{
				nPosY-=2;
			}
			break;
		case 106: //J
			{
				nPosY-=2;
			}
			break;
		case 112: //P
			{
				nPosY-=2;
			}
			break;
		case 113: //Q
			{
				nPosY-=2;
			}
			break;
		case 121: //Y
			{
				nPosY-=2;
			}
			break;
		case 122: //Z
			{
				nPosY-=2;
			}
			break;
		}
		switch(ch)
		{
			case 33:
			{
				nPosX += (int)(11*scale);
			}
			break;
			case 34:
			{
				nPosX += (int)(19*scale);
			}
			break;
			case 39:
			{
				nPosX += (int)(11*scale);
			}
			break;
			case 46:
			{
				nPosX += (int)(11*scale);
			}
			break;
			case 48:
			{
				nPosX += (int)(25*scale);
			}
			break;
			case 49:
			{
				nPosX += (int)(19 * scale);
			}
			break;
			case 50:
			{
				nPosX += (int)(23 * scale);
			}
			break;
			case 51:
			{
				nPosX += (int)(24 * scale);
			}
			break;
			case 52: //4
			{
				nPosX += (int)( 22* scale);
			}
			break;
			case 53:
			{
				nPosX += (int)(24 * scale);
			}
			break;
			case 54:
			{
				nPosX += (int)(25*scale);
			}
			break;
			case 55: //7
			{
				nPosX += (int)(25*scale);
			}
			break;
			case 56:
			{
				nPosX += (int)(25*scale);
			}
			break;
			case 57:
			{
				nPosX += (int)(22*scale);
			}
			break;
			case 58:
			{
				nPosX += (int)(11*scale);
			}
			break;
			case 63: //?
			{
				nPosX += (int)(21*scale);
			}
			break;
			case 65: //A
			{
				nPosX += (int)(26*scale);
			}
			break;
			case 66://B
			{
				nPosX += (int)(34*scale);
			}
			break;
			case 67://C
			{
				nPosX += (int)(34*scale);
			}
			break;
			case 68://D
			{
				nPosX += (int)(30*scale);
			}
			break;
			case 69://E
			{
				nPosX += (int)(29*scale);
			}
			break;
			case 70://F
			{
				nPosX += (int)(28*scale);
			}
			break;
			case 71://G
			{
				nPosX += (int)(30*scale);
			}
			break;
			case 72://H
			{
				nPosX += (int)(27*scale);
			}
			break;
			case 73://I
			{
				nPosX += (int)(23*scale);
			}
			break;
			case 74://J
			{
				nPosX += (int)(22*scale);
			}
			break;
			case 75://K
			{
				nPosX += (int)(29*scale);
			}
			break;
			case 76://L
			{
				nPosX += (int)(29*scale);
			}
			break;
			case 77://M
			{
				nPosX += (int)(34*scale);
			}
			break;
			case 78://N
			{
				nPosX += (int)(32*scale);
			}
			break;
			case 79://O
			{
				nPosX += (int)(31*scale);
			}
			break;
			case 80://P
			{
				nPosX += (int)(26*scale);
			}
			break;
			case 81://Q
			{
				nPosX += (int)(31*scale);
			}
			break;
			case 82://R
			{
				nPosX += (int)(34*scale);
			}
			break;
			case 83://S
			{
				nPosX += (int)(31*scale);
			}
			break;
			case 84://T
			{
				nPosX += (int)(30*scale);
			}
			break;
			case 85://U
			{
				nPosX += (int)(33*scale);
			}
			break;
			case 86://V
			{
				nPosX += (int)(30*scale);
			}
			break;
			case 87://W
			{
				nPosX += (int)(34*scale);
			}
			break;
			case 88://X
			{
				nPosX += (int)(26*scale);
			}
			break;
			case 89://Y
			{
				nPosX += (int)(25*scale);
			}
			break;
			case 90://Z
			{
				nPosX += (int)(24*scale);
			}
			break;
			case 91: // [
			{
				nPosX += (int)(11*scale);
			}
			break;
			case 93:// ]
			{
				nPosX += (int)(12*scale);
			}
			break;
			case 97://a
			{
				nPosX += (int)(23*scale);
			}
			break;
			case 98://b
			{
				nPosX += (int)(19*scale);
			}
			break;
			case 99://c
			{
				nPosX += (int)(18*scale);
			}
			break;
			case 100://d
			{
				nPosX += (int)(18*scale);
			}
			break;
			case 101://e
			{
				nPosX += (int)(20*scale);
			}
			break;
			case 102://f
			{
				nPosX += (int)(13*scale);
			}
			break;
			case 103://g
			{
				nPosX += (int)(21*scale);
			}
			break;
			case 104://h
			{
				nPosX += (int)(16*scale);
			}
			break;
			case 105://i
			{
				nPosX += (int)(11*scale);
			}
			break;
			case 106://j
			{
				nPosX += (int)(14*scale);
			}
			break;
			case 107://k
			{
				nPosX += (int)(19*scale);
			}
			break;
			case 108://l
			{
				nPosX += (int)(14*scale);
			}
			break;
			case 109://m
			{
				nPosX += (int)(34*scale);
			}
			break;
			case 110://n
			{
				nPosX += (int)(24*scale);
			}
			break;
			case 111://o
			{
				nPosX += (int)(20*scale);
			}
			break;
			case 112://p
			{
				nPosX += (int)(20*scale);
			}
			break;
			case 113://q
			{
				nPosX += (int)(22*scale);
			}
			break;
			case 114://r
			{
				nPosX += (int)(21*scale);
			}
			break;
			case 115://s
			{
				nPosX += (int)(23*scale);
			}
			break;
			case 116://t
			{
				nPosX += (int)(16*scale);
			}
			break;
			case 117://u
			{
				nPosX += (int)(24*scale);
			}
			break;
			case 118://v
			{
				nPosX += (int)(21*scale);
			}
			break;
			case 119://w
			{
				nPosX += (int)(27*scale);
			}
			break;
			case 120://x
			{
				nPosX += (int)(25*scale);
			}
			break;
			case 121://y
			{
				nPosX += (int)(20*scale);
			}
			break;
			case 122://z
			{
				nPosX += (int)(17*scale);
			}
			break;
		}
		//nPosX += (int)(m_nCharWidth * scale);
	}
}

CBitmapFont* CBitmapFont::GetInstance()
{
	static CBitmapFont instance;
	return &instance;
}
